# encoding: utf-8
from datetime import datetime, timedelta
from loguru import logger
from services.trading_calendar_service import TradingCalendarService


def get_latest_trading_date(reference_date=None):
    """
    获取最近一个交易日
    
    Args:
        reference_date (str, optional): 参考日期，格式为 YYYY-MM-DD，默认为当前日期
        
    Returns:
        str: 最近一个交易日，格式为 YYYY-MM-DD，如果获取失败则返回 None
    """
    try:
        if reference_date is None:
            reference_date = datetime.now().strftime('%Y-%m-%d')
        
        # 创建交易日历服务实例
        trading_calendar_service = TradingCalendarService()
        
        # 获取参考日期前30天到参考日期的交易日历
        ref_datetime = datetime.strptime(reference_date, '%Y-%m-%d')
        start_date = (ref_datetime - timedelta(days=30)).strftime('%Y-%m-%d')
        
        # 查询交易日历数据
        result = trading_calendar_service.get_trading_calendar(start_date=start_date, end_date=reference_date)
        
        if result and result.get('code') == 200:
            data = result.get('data', [])
            if data:
                # 获取最近的一个交易日
                latest_trading_date = data[0]['trade_date']
                logger.info(f"获取到最近交易日: {latest_trading_date}")
                return latest_trading_date
            else:
                logger.warning(f"在 {start_date} 到 {reference_date} 期间未找到交易日")
                return None
        else:
            logger.error(f"查询交易日历失败: {result.get('message', '未知错误') if result else '请求失败'}")
            return None
            
    except Exception as e:
        logger.exception(f"获取最近交易日时出错: {e}")
        return None


def get_previous_trading_date(reference_date=None):
    """
    获取指定日期的前一个交易日
    
    Args:
        reference_date (str, optional): 参考日期，格式为 YYYY-MM-DD，默认为当前日期
        
    Returns:
        str: 前一个交易日，格式为 YYYY-MM-DD，如果获取失败则返回 None
    """
    try:
        if reference_date is None:
            reference_date = datetime.now().strftime('%Y-%m-%d')
        
        # 创建交易日历服务实例
        trading_calendar_service = TradingCalendarService()
        
        # 获取参考日期前60天到参考日期的交易日历（确保有足够的数据）
        ref_datetime = datetime.strptime(reference_date, '%Y-%m-%d')
        start_date = (ref_datetime - timedelta(days=60)).strftime('%Y-%m-%d')
        
        # 查询交易日历数据
        result = trading_calendar_service.get_trading_calendar(start_date=start_date, end_date=reference_date)
        
        if result and result.get('code') == 200:
            data = result.get('data', [])
            if len(data) >= 2:
                # 第二个元素就是前一个交易日（第一个是当前或最近的交易日）
                previous_trading_date = data[1]['trade_date']
                logger.info(f"获取到前一个交易日: {previous_trading_date}")
                return previous_trading_date
            else:
                logger.warning(f"在 {start_date} 到 {reference_date} 期间未找到足够的交易日")
                return None
        else:
            logger.error(f"查询交易日历失败: {result.get('message', '未知错误') if result else '请求失败'}")
            return None
            
    except Exception as e:
        logger.exception(f"获取前一个交易日时出错: {e}")
        return None